#pragma once

#include <vector>
#include <hash_map>

#include "Cena.h"
#include "GameObject.h"

using namespace std;

class Cenario : public Cena
{
public:
	Cenario(irr::scene::ISceneManager *scene);
	~Cenario(void);

	void CriarChao(int id, char *textureName, Renderizador *render, GerenciaFisica *fisica);

	// carrega cena irr (criada no irrEdit)
	void CarregaIrr(char *nomeIrr, GerenciaFisica *fisica);

	//adiciona um gameObject no cenario atual, passa o se id, a mesh, etc
	void AddGameObject(int id, char *nomeMesh, GerenciaFisica *fisica, GameObject *obj = new GameObject(), NxVec3 pos = NxVec3(0, 0, 0), NxVec3 Escala = NxVec3(1, 1, 1), bool dinamico = true);
	void AddCamera(NxVec3 pos = NxVec3(0, 0, 0), NxVec3 look = NxVec3(0, 0, 0));
	
	void AplicarTexturaLastGameObject(char *textureName, int idGameObject, Renderizador *render);
	void AplicarTextura(char *textureName, int idGameObject, Renderizador *render);

	//retorna o GameObject dado o id dele
	GameObject *GetGameObject(int id);
	//para casos de duplicata, pegar o ultimo elemento adicionado com a chave duplicada
	GameObject *GetLastGameObject(int id);
	//deleta um objeto
	void DeleteObj(int id, GerenciaFisica *fisica);
	void DeleteObj(std::hash_multimap<int, GameObject*>::iterator &it, GerenciaFisica *fisica);

	void DeletaTodosObjs(GerenciaFisica *fisica);

	void WakeUp();

	irr::scene::ICameraSceneNode *GetCamera();
	void SetCameraPos(vector3df pos, vector3df look);
	void Atualiza();

	std::hash_multimap<int, GameObject*> GetMap() const;

private:

	//camera da cena
	irr::scene::ICameraSceneNode *camera;

	std::hash_multimap<int, GameObject*> objetos;
	std::hash_multimap<int, GameObject*>::iterator it;
	std::hash_multimap<int, GameObject*>::reverse_iterator rit;
};

